package org.bibpessoal.fachada;

import java.util.List;

import javax.ejb.*;

import org.bibpessoal.daos.EmprestimoDAO;
import org.bibpessoal.daos.LivroDAO;
import org.bibpessoal.daos.UsuarioDAO;
import org.bibpessoal.entidades.Amizade;
import org.bibpessoal.entidades.Emprestimo;
import org.bibpessoal.entidades.Livro;
import org.bibpessoal.entidades.Usuario;
import org.bibpessoal.exceptions.LivroInvalidoException;
import org.bibpessoal.exceptions.UsuarioInvalidoException;

@Stateless
public class BibliotecaPessoalFachadaImpl implements BiblitoecaPessoalFachada {
	@EJB
	private UsuarioDAO usuarioDAO;

	@EJB
	private LivroDAO livroDAO;
	
	@EJB
	private EmprestimoDAO emprestimoDAO;

	//Apenas Consulta de Dados
	@Override
	@TransactionAttribute(TransactionAttributeType.NOT_SUPPORT)
	public Usuario autenticarUsuario(String login, String senha)
			throws UsuarioInvalidoException {
		return usuarioDAO.autenticar(login, senha);
	}

	//Criação de dados em nova transação
	//Pode haver falha na verificação dos dados e na persistencia
	//Transações diferentes facilitam a identificação da origem do erro
	@Override
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public boolean cadastrarUsuario(Usuario novo)
			throws UsuarioInvalidoException {
		return usuarioDAO.cadastrarUsuario(novo);
	}

	//Apenas Consulta de Dados
	@Override
	@TransactionAttribute(TransactionAttributeType.NOT_SUPPORT)
	public List<Usuario> getOutrosUsuarios(int idUsuario)
			throws UsuarioInvalidoException {
		return usuarioDAO.listarOutrosUsuarios(idUsuario);
	}

	//Apenas Consulta de Dados
	@Override
	@TransactionAttribute(TransactionAttributeType.NOT_SUPPORT)
	public List<Livro> getLivrosPorUsuario(int idUsuario)
			throws UsuarioInvalidoException {		
		return livroDAO.buscarLivrosUsuario(idUsuario);
	}
	
	//Verificação de dados e persistencia são feitos no DAO
	//requer o inicio ou continuação de uma transação
	@Override
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public boolean cadastrarLivro(Usuario usuario, Livro livro) throws LivroInvalidoException{
		return livroDAO.cadastrarLivro(usuario, livro);
	}

	//Apenas Consulta de Dados
	@Override
	@TransactionAttribute(TransactionAttributeType.NOT_SUPPORT)
	public List<Livro> buscarLivro(String titulo, int idUsuario) {
		return livroDAO.buscarLivro(titulo, idUsuario);
	}
	
	//Persistencia de Dados requer o inicio ou continuação de uma transação
	@Override
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public boolean solicitarAmizade(Amizade amizade) {
		return usuarioDAO.solicitarAmizade(amizade);
	}
	
	//Persistencia de Dados requer o inicio ou continuação de uma transação
	@Override
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public boolean responderSolicitacao(Amizade amizade) {
		return usuarioDAO.responderSolicitacao(amizade);
	}
	
	//Apenas Consulta de Dados
	@Override
	@TransactionAttribute(TransactionAttributeType.NOT_SUPPORT)
	public List<Emprestimo> getLoansRequests(){
		return emprestimoDAO.selectAll();
	}
	
	//Apenas Consulta de Dados
	@Override
	@TransactionAttribute(TransactionAttributeType.NOT_SUPPORT)
	public List<Emprestimo> getLoansPendent(){
		return emprestimoDAO.selectAllPendent();
	}
	
	//Apenas Consulta de Dados
	@Override
	@TransactionAttribute(TransactionAttributeType.NOT_SUPPORT)
	public List<Emprestimo> getLoansDevolved(){
		return emprestimoDAO.selectAllDevolved();
	}
	
	//Apenas Consulta de Dados
	@Override
	@TransactionAttribute(TransactionAttributeType.NOT_SUPPORT)
	public Emprestimo getOneLoan(int i){
		return emprestimoDAO.selectAll(i, 1).get(0);
	}
	
	//Apenas Consulta de Dados
	@Override
	@TransactionAttribute(TransactionAttributeType.NOT_SUPPORT)
	public List<Emprestimo> getRangeLoan(int start, int range){
		return emprestimoDAO.selectAll(start, range);
	}
	
	//Apenas Consulta de Dados
	@Override
	@TransactionAttribute(TransactionAttributeType.NOT_SUPPORT)
	public List<Livro> getLivrosEmprestadosAMaisDeUmMes() {
		return livroDAO.getLivrosEmprestadosAMaisDeUmMes();

	}
}
